// Copyright (c) 2025 Shenzhen Kaihong Digital Industry Development Co., Ltd.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

use ohmw_core::bincode::{Decode, Encode};
use ohmw_derive::{Decode, Encode};

#[derive(Encode, Decode)]
pub struct TaggedMsg<M: Encode + Decode> {
    pub tag: String,
    pub msg: M,
}

#[derive(Encode)]
pub struct RefTaggedMsg<'a, M: Encode> {
    pub tag: &'a str,
    pub msg: M,
}

pub trait MsgTag: Encode + Sized {
    fn tag(&self) -> &'static str;

    fn to_ref_tagged(self) -> RefTaggedMsg<'static, Self> {
        RefTaggedMsg {
            tag: self.tag(),
            msg: self,
        }
    }
}

impl MsgTag for u32 {
    fn tag(&self) -> &'static str {
        "uint32"
    }
}

impl MsgTag for &str {
    fn tag(&self) -> &'static str {
        "string"
    }
}

impl MsgTag for String {
    fn tag(&self) -> &'static str {
        "string"
    }
}
